package com.lifeibiao.tools;
import java.lang.StringBuffer;
import java.text.MessageFormat;

public class StringTestDriver {
    public static void main(String[] args) {
        //test01();
        //test02();
        //test03();
        test04();
    }

    /**
     * String工具类：MessageFormat
     */
    private static void test04(){
        // 创建MessageFormat类的一个实例对象
        // 带占位符的格式
        String strFormat = "我是{0},来自{1},稀罕{2}";
        MessageFormat mf = new MessageFormat(strFormat);
        // 占位符需要替换的参数数组（以数组的形式或变长参数的形式提供可以替换的参数）
        Object[] paras = new Object[]{"小明","河北","写代码"};
        String strMessage = mf.format(paras);
        System.out.println(strMessage);
    }

    /**
     *String工具类：StringBuilder
     */
    private static void test03(){
        // 创建一个StringBuilder的实例对象
        StringBuilder sb = new StringBuilder();
        // 动态拼接字符串
        sb.append("Hello!");
        sb.append("小明").append(",吃饭了么？");
        System.out.println("字符串内容："+sb);
        StringBuilder sb2 = sb.reverse();
        System.out.println("Old字符串内容："+sb);
        System.out.println("Reversed字符串内容："+sb2);
        System.out.println("---------------------------------------");

        // String是按值传参的
        // 验证程序
        String stuName = "夏明";
        System.out.println("主方法中实参传递之前的值："+stuName);
        // 将实参的值通过方法调用的形式传递给形参
        test02sub(stuName); // 此处所传递的参数 stuName是实参
        System.out.println("主方法中实参传递之后的值："+stuName);
    }

    /**
     * 子方法调用
     * @param stuName 形参 （此处函数定义时写的参数stuName是形参）
     */
    private static void test02sub(String stuName){
        System.out.println("子方法中参数修改之前的值："+stuName);
        // 子方法对函数调用传递的值进行修改
        stuName += "lalala";
        System.out.println("子方法中参数修改之后的值："+stuName);
    }

    /*
        相关概念：
            实参：函数调用时所传递的参数是实参；
            形参：函数定义时写在()中的参数；

            按值传参：实参的值传递给形参，形参进行了改变不会影响实参的值；
                8种基本数据类型（及其包装类）、String类型；
            按引用（址）传参：实参的地址引用传给形参，形参进行了改变会影响实参的值；
                除了String之外的所有的对象类型，包括数组；
         */

    /**
     * 字符串的存储
     */
    private static void test02(){
        int i = 10; // 10 就是常量
        // 定义一个字符串
        String str00 = "小明"; // 栈中 此处 创建了 1个
        String str01 = "小明"; // 栈中 创建了 1个对象（常量池中的元素不重复）
        // 如果只有下面一行代码执行的话，请问在该行代码之后在内存中创建了 2个对象
        String str10 = new String("小明"); // 创建了 2个对象 堆中
        String str11 = new String("小明"); // 创建了 3个对象 堆中

        System.out.println("str00 == str10::"+(str00 == str10));
        System.out.println("str00 == str01::"+(str00 == str01));
        System.out.println("str11 == str10::"+(str11 == str10));
        System.out.println("str00 == str11::"+(str00 == str11));

        String str20 = "小";
        String str21 = "明";

        String str30 = str20 + str21;//堆中

        String str40 = "小" + "明";//栈中   此行代码在内存中创建了3个对象

        String str50 = str20 + "明";//堆中

        System.out.println("str30 == str00::"+(str30 == str00));

        System.out.println("str40 == str00::"+(str40 == str00));

        System.out.println("str50 == str00::"+(str50 == str00));

    }
    /**
     * String类常用方法：indexOf
     */
    private static void test01(){
        String str0 = "aslbkdjfa;;ssld,klfjldiw|em,rnjjdnfmdger";
        String str1="aslKdjfa;;ssld,klfjldiw|em,rnjjdnfmdger";
        System.out.println("原始字符串："+str0);
        System.out.println("a的位置为"+str0.indexOf('a'));
        System.out.println("a的位置为"+str0.indexOf(97));//ASCII码对应的字母

        System.out.println("substring截取字符串：");
        System.out.println(""+str0.substring(3));
        System.out.println(""+str0.substring(str0.indexOf('k')));
        System.out.println(str0.substring(3,5));

        System.out.println("字符串分割");
        String[] strs=str0.split(",");
        for (String str :strs){
            System.out.println(str);
        }

        System.out.println("字符串分割2");
        String[] strs2=str0.split("[|]");
        for (int i=0;i<strs2.length;i++){
            System.out.println(strs2[i]);
        }

        char a = str0.charAt(2);
        System.out.println(a);
        System.out.println(str0.codePointAt(3));
        System.out.println(str0.codePointBefore(3));
        System.out.println(str0.codePointCount(1,3));
        System.out.println(str0.compareTo(str1));
        System.out.println(str0.compareToIgnoreCase(str1));
        System.out.println(str0.concat(str1));
        System.out.println(str0.contains("asl"));
        System.out.println(str0.contentEquals(str1));
        char[] data={'a','s','l','k'};

        byte[] data1;

        System.out.println(str0.copyValueOf(data));
        System.out.println(str0.copyValueOf(data ,1 ,3));

        System.out.println(str0.endsWith("ger"));

        System.out.println(str0.equals(str1));

        System.out.println(str0.equalsIgnoreCase(str1));

        data1=str0.getBytes();
        for (byte c:data1){
            System.out.print(c+" ");
        }
        System.out.println();
        System.out.println("查找指定下标的字符："+str0.indexOf(97,2));
    }


}
